iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0

我們來學習新東西囉~


解構元

解構元(destruotor)與建構元一樣,都是C++裡一種特殊的函數,所不同的是它們的呼叫時機。建構元是在物件初次被建立時呼叫,而解構元恰好相反,巳是在物件已經不再需要而被銷毀(destroy)時呼叫。所謂的銷毀,指的是釋放物件原先所佔有的記憶空間。

解構元和建構元一檬,也是類別的成員之一。在C++裡,解構元的名稱和類別的名稱相同,但之前必須加上一個(tide)符號。此外,解構元没有傳回值,也不能傳入任何引數。下面為解構元的定義格式:

~類別名稱()    //解構元的名稱必須和類別名稱相同
{
    程式敘述;
      ....
}

解構元的使用

我們所建立的物件均是由預設的解構元(default constructor)進行銷毀的動作。預設的解構元是由編譯器白動產生,當程式碼裡没有撰寫任何的解構元時,編譯器便會提供預設的解構元,這也就是到目前為止,前幾章所撰寫的程式還能順利執行的原因。

解構元到底在玩什麼把戲呢?我們舉個實例來做說明。下面的範例裡刻意的加入一個解構元,裡面包含一些程式碼,用來顯示出是哪一個物件的解構元被呼叫。若是程式裡已提供解構元,編譯器便會使用使用者自訂的版本,而不會使用預設的解構元。程式的撰寫如下:

//prog14_1,解構元的使用
#include <iostream>
#include <cstdlib>
using namespace std;
class CWin{                         //定義視窗類別CWin
	private:
		char id;
		int width, height;
		
	public:
		CWin(char i,int w,int h):id(i),width(w),height(h){  
			cout << "建構元被呼叫了..." << endl; 
		}
		~CWin(){                   //解構元
			cout << "建構元被呼叫了,Win" << this->id << "被銷毀了.." << endl;
			system("pause"); 
		}     
		void show_member(void){    
			cout << "Window " << id << ": ";
			cout << "width=" << width << ", height=" << height << endl; 
		}
};           

int main(void){
	CWin win1('A',50,40);        
	CWin win2('B',40,50);       
	CWin win3('C',60,70);
	CWin win4('D',90,40);
	
	win1.show_member();
	win2.show_member();
	
	system("pause");
	return 0; 
}

程式的結果如下:
https://ithelp.ithome.com.tw/upload/images/20241007/201694107EWXhD9jw3.jpg

解構元的開頭必須加上「~」符號,名稱與類別相同,且没有引數與傳回值。由於程式裡已提供這個解構元,因此編譯器會執行這個版本。當這個解構元被呼叫時,它會顯示出"解構元被呼叫了"字串,並且顯示出呼叫它之物件的id 成員。值得一提的是,程式中刻意加入system ("pause");這行指令,用來暫停程式的執行。這是因為在main()主程式裡所建立的物件,在main()函數結束後,物件才會被銷毀,因此解構元是在main()結束後才會被呼叫。如果不加上這行,則程式執行完解構元後就自動關閉視窗,會因為速度太快而導致看不到畫面,因此加上這行來捕捉螢幕上的訊息。


各位再撐一下!


上一篇
Day23 認識建構元
下一篇
Day25 拷貝建構元
系列文
用30天學習C++26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言